LinuC-1 - 101試験 - 1.02:ファイル・ディレクトリの操作と管理 - 1.02.1 ファイルの所有者とパーミッション

Last Update : August 21 2022 17:47:21

     

a. 所有者

Linux 上でファイルやディレクトリを作成すると、作成したユーザーがその所有者として設定されます。また、所有者のプライマリグループがファイルやディレクトリのグループとして設定されます。
Linux システム上のすべてのファイルやディレクトリには、 1 人の所有者と 1 つのグループが関連付けられます。


b. アクセス権

ファイル・ディレクトリには、どのユーザーにどのような操作を許可するという権限(アクセス権)が設定されます。
このアクセス権は、ファイル・ディレクトリの所有者、所有者グループに属するユーザー、それ以外のユーザーの3種類のユーザーに対してそれぞれ設定できます。
アクセス権には、読み取り可能、書き込み可能、実行可能の3種類の権限があります。
これらの設定をパーミッションと呼んでいます。

  • 読み取り権: r
    そのファイルの内容を読み取ることができます。
    ディレクトリの場合は、ディレクトリ内のファイルの一覧を表示することができます。
  • 書き込み権: w
    ファイルの内容を書き換えることができます。
    ディレクトリの場合は、そのディレクトリ内でファイルやディレクトリの作成や削除ができます。
  • 実行権: x
    そのファイルを実行することができます。
    ディレクトリの場合は、中のファイルにアクセスすることができます。

c. アクセス権の管理

1.ファイルの属性/パーミッションの概念

ファイルやディレクトリには、ファイルの形式、アクセス権限、所有者、所有グループ、最終更新日時などの属性をもっています。ls -l コマンドによってこれらの属性を確認する事ができます。左から順番に、パーミッション、ファイルの所有者、ファイルの所有グループ、ファイルサイズ、最終更新日時、ファイル名となっています。

$ ls -l drwxr-xr-x 2 root root 4096 2月 4 17:22 etc -rw-r--r-- 1 root root 0 2月 5 01:44 file1 lrwxrwxrwx 1 root root 5 2月 5 01:44 file2 -> file1



一番左にある drwxr-xr-x がパーミッションを表しています。パーミッションとは、ファイルやディレクトリが第三者によって勝手に書き換えられたり、読み取られたりされないように設定するための権限のことです。アクセス権とも呼ばれます。Linux においてこのパーミッションは非常に重要な意味を持っています。r ( read )は、読み取り権限を表し、w ( wirte )は、書き込み権限、x ( execute )は実行権限を表しています。次に、例えば、rwxrwxrwx というパーミッションの場合、最初のrwx が所有者を表し、2番目の rwx が所有グループ、3番目の rwx がその他のユーザーを表しています。要するに、誰でも読み書き実行が可能なファイルという意味になります。パーミッションは、rwx の表記方法以外にも数値で表現することができます。r は 4 、w は 2、x は 1 を意味し、rwxrwxrwx を数値で表現すると、777 ということになります。

読み取り r 4 ディレクトリ内の一覧表示が可能
書き込み w 2 ディレクトリ内でファイルの作成/変更/削除が可能
実行 x 1 ディレクトリ内のファイルにアクセスが可能
権限なし - 0 ディレクトリ内のファイルにアクセスが不可

※ls -l で表示した場合、パーミッション欄の横にピリオドやプラスがつくことがあります。
 "." ピリオドは SELinuxのセキュリティコンテキストが付いているファイルです。selinux の control 下にあれば付きます。
 "+" プラスは ACLの設定されたファイルです。
ls -Z オプションはSELinuxのセキュリティコンテキストを表示するオプション。


2.アクセス権限の変更 [ chmod ]

アクセス権限を変更するには、chmod コマンドを使用します。

● chmod コマンド構文
  chmod [オプション] [ファイル・ディレクトリ]

●オプションの各符号の意味
 u所有者
 g所有グループ
 oその他のユーザー
 a全てのユーザー
 +アクセス権限を追加
 -アクセス権限を削除
 =アクセス権を指定する
 sSUID あるいは、SGID(以下後述)
 tスティッキービット(以下後述)
 -R指定したディレクトリ以下にある全ファイルのアクセス権を変更する

例えば、ある特定のファイルのパーミッションを666から644に変更したい場合は以下のようにします。

# chmod 644 file1
# ls -l

-rw-r--r-- 1 root root 0 2月 5 01:44 file1

上記は特定の1ファイルのみのアクセス権限を変更しましたが、ディレクトリ内の中のファイルも含めてディレクトリごと再帰的に変更したい場合は、-R オプションを使用します。

# chmod -R 755 directory
# ls -l
drwxr-xr-x 2 root root 4096 2月 5 03:56 directory

アクセス権の設定を数値で表現する場合は、指定したアクセス権への変更のみとなり、特定のアクセス権の追加と削除を行う事はできません。それを実現する方法として、アルファベットで表記する場合があります。例えば、以下の例では、directory に対してグループの実行権限を削除しています。

$ chmod g-x directory

次に、全てのユーザーに対して実行権限を付与する例です。+ で権限の付加、- で権限の削除が行えるようになります。なお、a をつけずに単に、chmod +x とした場合は、a+x を実行したのと同様の意味になります。

$ chmod a+x directory

符号に = を使う事もできます。以下の例では、その他のユーザーには、読み取り権限のみを与えるという意味になります。

$ chmod o=r directory


3.ファイルの所有者、所有グループの変更 [ chown ] [ chgrp ]

chown コマンドは、ファイルの所有者及びグループの変更を行う事ができます。chgrp コマンドは、所有グループの変更のみ行う事ができます。chown の書式は以下の通りです。chown で、所有グループも変更したい場合は、コロン「: 」を用いて後ろにグループ名を記述します。なお、コロンの代わりにドット「. 」で区切っても同様の意味になります。-R オプションでディレクトリ内のファイルとディレクトリの所有者/所有グループを再帰的に変更する事ができます。

chown [ オプション ] <ユーザー名 [ :グループ名 ]> < ファイルまたはディレクトリ名>

chgrp [ オプション ] <グループ名> < ファイルまたはディレクトリ名>

# chown sakura:sakura file1
# ls -l
drwxr-xr-x 2 sakura sakura 4096 2月 5 03:56 file1

● chown コマンド構文
  chown [オプション] ユーザー名 [:グループ名] [ファイル・ディレクトリ]

● chown コマンドオプション
 -c 結果の詳細表示
 -R 指定したディレクトリ内のファイル及びディレクトリの所有者/所有グループも再帰的に変更する

● chgrp コマンド構文
  chgrp [オプション] グループ名 [ファイル・ディレクトリ]

● chgrp コマンドオプション
 -c 変更があったとき、メッセージを表示する
 -v コマンドの実行状況を表示する
 -f エラーメッセージを表示しない
 -h シンボリックリンク自体のグループを変更する
 -R ディレクトリ内のグループも変更する


d. SUID / SGID

1.SUID / SGID

SUID とは、Set User ID の略で、SUID が設定されているコマンドやプログラムが実行されると、実行したユーザーではなく、そのファイルの所有者の権限で実行されたものとみなします。

SUID を設定するには、chmod コマンドを実行する際に、ファイル所有者のアクセス権を設定する引数として、「s 」あるいは、「4000 」を指定します。なお、実行権限を元々持っていないファイルの場合(644 など)は、SUID ビットをOn にした際に大文字の S が表示されます。実行権限を持ったファイルの場合は、小文字の s が表示されます。

# chmod u+s file1
# ls -l

-rwSr--r-- 1 root root 0 2月 5 01:44 file1

# chmod u+s directory
# ls -l

drwsr-xr-x 2 root root 4096 2月 5 03:56 directory

以下の例では、アクセス権が 755 のファイルにSUID を設定する場合です。

# chmod 4755 directory2

SGID は、Set Group ID の略で、SGID が設定されているコマンドやプログラムが実行されると、実行したユーザー、もしくはグループではなく、そのファイルの所有グループの権限で実行されたものとみなします。SUID と異なる点は、アルファベットに g を用い、数値で表現する場合は 2000 になります。

# chmod g+s directory
# ls -l

drwsr-sr-x 2 root root 4096 2月 5 03:56 directory

# chmod 2755 directory2
# ls -l

drwxr-sr-x 2 root root 4096 2月 5 04:45 directory2


e. スティッキービット(stickybit)

1.スティッキービット(stickybit)

スティッキービット とは、ディレクトリに対して設定するアクセス権のひとつで、ファイルに関してはほとんど有効性がありません。ステッキービットが設定されているディレクトリでは、書き込みが許可されたファイルであっても、他のユーザーが所有しているものは削除できないようになります。スティッキービットのついたディレクトリ配下に作成したファイル、ディレクトリは、所有者以外はファイル・ディレクトリの名前変更・削除ができなくなります。/tmp ディレクトリなど、他のユーザーに一時ファイルを削除されては困るという場合に使用します。スティッキービットをOn にするには、t もしくは、数字の 1000 を使用します。
スティッキービットを On にした場合は、実行権が t になります。

# chmod +t directory
# ls -l

drwsr-sr-t 2 root root 4096 2月 5 03:56 directory

# chmod 1755 directory2
# ls -l
drwxr-xr-t 2 root root 4096 2月 5 04:45 directory2

スティッキービットを Off にするには以下のようにします。

# chmod -t directory
# ls -l
drwsr-sr-x 2 root root 4096 2月 5 03:56 directory


f. デフォルトのアクセス権

umask とは、現在のユーザーがファイルやディレクトリを新たに作る際の、デフォルトのパーミッションの指定を行う為のマスクを設定します。 ファイル作成時のデフォルトパーミッションは666、ディレクトリは777であり、この数値と「umaskで指定されたマスクの論理否定(umaskのビット列をビット反転したもの)」との論理積が、ファイルやディレクトリ作成時の最終的なパーミッションとなります。
ファイルのデフォルトアクセス権は、「rw-rw-rw-」、ビットで表すと「110 110 110」(8進数では666)であり、この値にumaskで指定した値の否定と論理積演算されます。
umask値の設定にはパーミッションとして利用したくないビットを「1」として指定します。umaskが0022の場合(所有者以外は書き込み不可。右側の3桁を使う)、ビットで表すと「000 010 010」になります。これの否定「111 101 101」とデフォルトパーミッションをAND演算します。

● 所有者以外は書き込み不可(umask:022=000 010 010)
ファイルの場合(デフォルト666)
    110 110 110 (666)
AND 111 101 101 (022の否定)
----------------
    110 100 100 (644)

ディレクトリの場合(デフォルト777)
    111 111 111 (777)
AND 111 101 101 (022の否定)
----------------
    111 101 101 (755)
● 所有者以外はアクセス不可(umask:077=000 111 111)
ファイルの場合(デフォルト666)
    110 110 110 (666)
AND 111 000 000 (077の否定)
----------------
    110 000 000 (600)

ディレクトリの場合(デフォルト777)
    111 111 111 (777)
AND 111 000 000 (077の否定)
----------------
    111 000 000 (700)

本来はビットで計算するが、数値表現の場合はデフォルトの数値からumask値を引き算すればよい。(ただし、対応する桁をひと桁ずつ計算する。マイナスになったら0とする)
umask値が022の場合に、ファイルを作成すると 666-022=644 がパーミッションとして適用されます。
フォルダを作成すると、777-022=755となります。
umask値が077の場合に、ファイルを作成すると 666-077=600 がパーミッションとして適用されます。
フォルダを作成すると、777-077=700となります。

umaskコマンドにオプション・引数を付けないで実行すると、現在設定されているumask値を表示します。

$ umask
0022

一番左の桁はsticky bit等特殊なパーミッションのためにあるので、ここでは右の3桁のみ確認します。値を指定すると、それ以降に新規作成するファイル・ディレクトリに適用されます(作成済みのファイルには影響を与えません)。

デフォルト以外のumask値の変更はログイン中のみ有効で、ログアウトするともとのumask値に戻ります。恒久的に特定のumask値を設定したい場合、ユーザのhomeディレクトリ配下の.bashrcに以下のように記述しておきます。
umask 027

なお、システム全体に適用されるumask値は/etc/.bashrcに記載されており、ここでの値は全ユーザーのumaskとして適用されます。

● umask コマンド構文
  umask [オプション] マスク値

● umask コマンドオプション
 -p 現在設定されているマスク設定を8進数形式で表示します。
 -S 現在設定されているマスク設定を記号(例:u=rwx,g=rwx,o=rwx)で表示します。

新規作成したディレクトリ内で、所有者だけがファイルにアクセスできるよう、パーミッション(マスク)を指定する場合

$ umask 077


g. ファイルの拡張属性変更

ext2、ext3といったファイルシステムでは、通常の属性(パーミッションや更新日時など)のほかに、拡張属性を設定することができます。
 ファイルの拡張属性を変更するには、chattr コマンドを使用します。 mode には、設定したいファイルの属性を指定します。 最初に、+ か - か = のいずれかを指定します。 それぞれ、後に続く属性の追加、削除、設定を意味します。 そして、属性には、主に以下を(複数)指定します。

● chattr コマンド構文
  chattr [オプション] 拡張属性 ファイル名

● chattr コマンドオプション
 -R 指定したディレクトリの中にある全てのファイルの属性を変更する

● 拡張属性
 Aatime を変更しない
 a追加書き込み以外の書き込み不可。(root のみ設定可能)
 c圧縮して保存。(読み出す時は自動的に伸長)
 ddump コマンドによるバックアップの対象外にする。
 i変更不可。(root のみ設定可能)
 S即座にディスクへ書き込み。(ライトスルー)
 s削除したとき、使用していたブロックを 0 にする。

また、属性を確認するには、lsattr コマンドを使用します。引数には、確認したいファイルを指定します。

● 変更付加属性の設定
# chattr +i test.txt
# lsattr test.txt

----i--------e- test.txt
# echo kakikomi >> test.txt
bash: test.txt: 許可がありません

z. 出題範囲概要

概要 :
  • 適切なパーミッションと所有者権限を使用して、ファイルへのアクセスを制御できる。

詳細 :
  • 通常ファイル、スペシャルファイル、およびディレクトリに対するアクセスパーミッションを管理する。
    chmod, ls
  • SUID、SGID、スティッキービットなどのアクセスモードを使用して、セキュリティを維持する。
    chmod, chown, chgrp, ls
  • ファイル作成マスクの変更方法を把握する。
    umask
  • グループフィールドを使用して、グループメンバーがファイルにアクセスできるようにする。
    chown, chgrp

  [ 例題 ] 


         

    www.it-shikaku.jp